package com.zhouzi.zhaoyang.base

import com.zhouzi.zhaoyang.http.SThrowable
import com.zhouzi.zhaoyang.mvp.ModelLoader
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.*

/**
 * Created by ZhouZi on 2019/4/3.
 * time:17:18
 * ----------Dragon be here!----------/
 * 　　　┏┓　　 ┏┓
 * 　　┏┛┻━━━┛┻┓━━━
 * 　　┃　　　　　 ┃
 * 　　┃　　　━　  ┃
 * 　　┃　┳┛　┗┳
 * 　　┃　　　　　 ┃
 * 　　┃　　　┻　  ┃
 * 　　┃　　　　   ┃
 * 　　┗━┓　　　┏━┛Code is far away from bug with the animal protecting
 * 　　　　┃　　　┃    神兽保佑,代码无bug
 * 　　　　┃　　　┃
 * 　　　　┃　　　┗━━━┓
 * 　　　　┃　　　　　　┣┓
 * 　　　　┃　　　　　　　┏┛
 * 　　　　┗┓┓┏━┳┓┏┛━━━━━
 * 　　　　　┃┫┫　┃┫┫
 * 　　　　　┗┻┛　┗┻┛
 * ━━━━━━━━━━━神兽出没━━━━━━━━━━━━━━
 */
open class BasePresenter<V : IBaseView> {

    var v: V? = null

    val model by lazy { ModelLoader() }

    private val presenterScope: CoroutineScope by lazy {
        CoroutineScope(Dispatchers.Main + Job())
    }

    fun attachView(v: V) {
        this.v = v
    }

    fun detachView() {
        v = null
        presenterScope.cancel()
    }

    private class MvpViewNotAttachedException internal constructor() :
        RuntimeException("你忘记调用BasePresenter.attachView()")

    fun launch(block: suspend () -> Unit, error: suspend (SThrowable) -> Unit) =
        presenterScope.launch {
            try {
                block()
            } catch (e: SThrowable) {
                if (e.code.equals("50002")){
                    v?.dismissLoadDialog()
                    v?.errorToken()
                }else{
                    error(e)
                }

            }
        }

}